package hr.ctg.domain.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.validator.NotNull;

/**
 * Opis entity.
 * 
 * @author MyEclipse Persistence Tools
 */
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "opis")
@NamedQueries( {
		@NamedQuery(name = "Opis.findByIdObjekta", query = "select oo from Opis oo where oo.objekt.idObjekta=?"),
		@NamedQuery(name = "Opis.findByWikiNotNullJezik", query = "select oo from Opis oo where oo.wikipedia is not null and oo.jezik = ?"),
		@NamedQuery(name = "Opis.findByWikiJezik", query = "select oo from Opis oo where oo.wikipedia = ? and oo.jezik = ?"),
		@NamedQuery(name = "Opis.findByMjestoOznaka", query = "select oo from Opis oo where oo.mjesto = ? and oo.jezik.oznaka = ?"),
		@NamedQuery(name = "Opis.findByOtokOznaka", query = "select oo from Opis oo where oo.otok = ? and oo.jezik.oznaka = ?"),
		@NamedQuery(name = "Opis.findByParkOznaka", query = "select oo from Opis oo where oo.park = ? and oo.jezik.oznaka = ?"),
		@NamedQuery(name = "Opis.findByZupanijaOznaka", query = "select oo from Opis oo where oo.zupanija = ? and oo.jezik.oznaka = ?"),
		@NamedQuery(name = "Opis.findByDrzavaOznaka", query = "select oo from Opis oo where oo.drzava = ? and oo.jezik.oznaka = ?") })
public class Opis implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = 4231357012607722598L;
	private Integer idOpisa;
	private Jezik jezik;
	private Objekt objekt;
	private Mjesto mjesto;
	private Otok otok;
	private Zupanija zupanija;
	private Drzava drzava;
	private Dogadjaj dogadjaj;
	private Park park;
	private String opis;
	private String wikipedia;
	private Date zadnjeAzuriranje;
	private String naziv;

	// Constructors

	/** default constructor */
	public Opis() {
	}

	/** minimal constructor */
	public Opis(final Integer idOpisaObjekta) {
		idOpisa = idOpisaObjekta;
	}

	/** full constructor */
	public Opis(final Integer idOpisa, final Jezik jezik, final Objekt objekt,
			final String opis) {
		this.idOpisa = idOpisa;
		this.jezik = jezik;
		this.objekt = objekt;
		this.opis = opis;
	}

	// Property accessors
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "id_opisa", unique = true, nullable = false, insertable = true, updatable = true)
	public Integer getIdOpisa() {
		return idOpisa;
	}

	public void setIdOpisa(final Integer idOpisa) {
		this.idOpisa = idOpisa;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@NotNull
	@ManyToOne(cascade = {}, fetch = FetchType.EAGER)
	@JoinColumn(name = "id_jezika", unique = false, nullable = false, insertable = true, updatable = true)
	public Jezik getJezik() {
		return jezik;
	}

	public void setJezik(final Jezik jezik) {
		this.jezik = jezik;
	}

	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_objekta", unique = false, nullable = true, insertable = true, updatable = true)
	public Objekt getObjekt() {
		return objekt;
	}

	public void setObjekt(final Objekt objekt) {
		this.objekt = objekt;
	}

	@NotNull
	@Column(name = "opis", unique = false, nullable = false, insertable = true, updatable = true)
	public String getOpis() {
		return opis;
	}

	public void setOpis(final String opis) {
		this.opis = opis;
	}

	@Column(name = "wikipedia", unique = false, nullable = true, insertable = true, updatable = true)
	public String getWikipedia() {
		return wikipedia;
	}

	public void setWikipedia(final String wikipedia) {
		this.wikipedia = wikipedia;
	}

	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_mjesta", unique = false, nullable = true, insertable = true, updatable = true)
	public Mjesto getMjesto() {
		return mjesto;
	}

	public void setMjesto(final Mjesto mjesto) {
		this.mjesto = mjesto;
	}

	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_otoka", unique = false, nullable = true, insertable = true, updatable = true)
	public Otok getOtok() {
		return otok;
	}

	public void setOtok(final Otok otok) {
		this.otok = otok;
	}

	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_zupanije", unique = false, nullable = true, insertable = true, updatable = true)
	public Zupanija getZupanija() {
		return zupanija;
	}

	public void setZupanija(final Zupanija zupanija) {
		this.zupanija = zupanija;
	}

	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_drzave", unique = false, nullable = true, insertable = true, updatable = true)
	public Drzava getDrzava() {
		return drzava;
	}

	public void setDrzava(final Drzava drzava) {
		this.drzava = drzava;
	}

	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_parka", unique = false, nullable = true, insertable = true, updatable = true)
	public Park getPark() {
		return park;
	}

	public void setPark(final Park park) {
		this.park = park;
	}

	@ManyToOne(cascade = {}, fetch = FetchType.LAZY)
	@JoinColumn(name = "id_dogadjaja", unique = false, nullable = true, insertable = true, updatable = true)
	public Dogadjaj getDogadjaj() {
		return dogadjaj;
	}

	public void setDogadjaj(final Dogadjaj dogadjaj) {
		this.dogadjaj = dogadjaj;
	}

	@Column(name = "naziv")
	public String getNaziv() {
		return naziv;
	}

	public void setNaziv(final String naziv) {
		this.naziv = naziv;
	}

	@Column(name = "zadnje_azuriranje", unique = false, nullable = true, insertable = true, updatable = true)
	public Date getZadnjeAzuriranje() {
		return zadnjeAzuriranje;
	}

	public void setZadnjeAzuriranje(final Date zadnjeAzuriranje) {
		this.zadnjeAzuriranje = zadnjeAzuriranje;
	}
}